package packageComune;
import java.net.Socket;
import packageServer.Server;

public class ClientHandler implements Runnable{

	
	private ClientProxy clProxy;
	private Server server;
	private Socket socket;
	private String str1,str2,str3,str4;
	
	public ClientHandler(Socket socket, Server server,ClientProxy clProxy){
		
		this.server=server;
		this.socket=socket;
		this.clProxy=clProxy;		
		this.clProxy.inizializzaBuffer(socket);
	}
	
	
	/**
	 * Gestore delle connessioni al Server.
	 * Traduce i parametri del messaggio attesi e viene invocato il metodo opportuno del server.
	 */
	public void run(){
		String mess,comando;
		
		mess=clProxy.receiveFromClient();
		comando=this.interpretaComando(mess);
		
				
		if(comando.equals("login"))
			{this.traduci2par(mess);			
				clProxy.rispostaServer(server.login(str1,str2));
			}
		
		if(comando.equals("creaUtente"))
		{
			this.traduci2par(mess);
			clProxy.rispostaServer(server.creaGiocatore(str1,str2));
		}
		
		if(comando.equals("creaRazza"))
			{this.traduci3par(mess);
			clProxy.rispostaServer(server.creaRazza(Integer.parseInt(str1),str2,str3));
			}
		
		if(comando.equals("accessoPartita"))
			{this.traduci1par(mess);
			clProxy.rispostaServer(server.accessoPartita(Integer.parseInt(str1)));
			}
		
		if(comando.equals("listaGiocatori"))
			{this.traduci1par(mess);
			clProxy.rispostaServer(server.listaGiocatori(Integer.parseInt(str1)));
			}
		
		if(comando.equals("classifica"))
			{	
				this.traduci1par(mess);
				clProxy.rispostaServer(server.classifica(Integer.parseInt(str1)));
			}
		
		if(comando.equals("logout"))
			{	this.traduci1par(mess);
				clProxy.rispostaServer(server.logout(Integer.parseInt(str1)));
			}
		
		if(comando.equals("uscitaPartita"))			
			{	this.traduci1par(mess);
			clProxy.rispostaServer(server.uscitaPartita(Integer.parseInt(str1)));
			}
		
		if(comando.equals("mappaGenerale"))			
			{	this.traduci1par(mess);
			clProxy.rispostaServer(server.mappaGenerale(Integer.parseInt(str1)));
			}
		
		if(comando.equals("listaDinosauri"))			
			{	this.traduci1par(mess);
			clProxy.rispostaServer(server.listaDino(Integer.parseInt(str1)));
			}
		
		if(comando.equals("vistaLocale"))			
			{	this.traduci2par(mess);
			clProxy.rispostaServer(server.vistaLocale(Integer.parseInt(str1),Integer.parseInt(str2)));
			}
		
		if(comando.equals("statoDinosauro"))			
			{	this.traduci2par(mess);
			clProxy.rispostaServer(server.statoDinosauro(Integer.parseInt(str1),Integer.parseInt(str2)));
			}
		
		if(comando.equals("cresciDinosauro"))			
			{	this.traduci2par(mess);
			clProxy.rispostaServer(server.cresciDinosauro(Integer.parseInt(str1),Integer.parseInt(str2)));
			}
		
		if(comando.equals("deponiUovo"))			
			{	this.traduci2par(mess);
			clProxy.rispostaServer(server.deponiUovo(Integer.parseInt(str1),Integer.parseInt(str2)));
			}
		
		if(comando.equals("muoviDinosauro"))			
			{	this.traduci4par(mess);
			clProxy.rispostaServer(server.muoviDino(Integer.parseInt(str1),Integer.parseInt(str2),Integer.parseInt(str3),Integer.parseInt(str4)));
			}
		
		if(comando.equals("richiestaTurno"))			
			clProxy.rispostaServer(server.richiestaTurnoDiChi()); 
		
		if(comando.equals("passaTurno"))			
			{	this.traduci1par(mess);
			clProxy.rispostaServer(server.passaTurno(Integer.parseInt(str1)));
			}
		
		clProxy.closeConn(socket);
	}
	
	
	/**
	 * Estrae un singolo parametro dal messaggio.
	 *  
	 * @param mess Messaggio ricevuto dal client che contiene il parametro da isolare.
	 */
	private void traduci1par(String mess){
		for(int i=0;i<mess.length();i++)
			if(mess.substring(i, i+1).equals(","))
				str1=mess.substring(i+1, mess.length());
	}
	
	
	/**
	 * Estrae due parametri dal messaggio ricevuto.
	 *  
	 * @param mess Messaggio ricevuto dal client che contiene i parametri da isolare.
	 */
	private void traduci2par(String mess){
		int i,k=0,j=0,giatrovata=0;
		for(i=1;i<mess.length();i++)
			{
				if(mess.substring(i, i+1).equals(","))
						if(giatrovata==0)
							{k=i;giatrovata=1;}
						else
							j=i;
			}

		str1=mess.substring(k+1,j);
		str2=mess.substring(j+1, mess.length());
	}
	
	
	/**
	 * Estrae tre parametri dal messaggio ricevuto.
	 *  
	 * @param mess Messaggio ricevuto dal client che contiene i parametri da isolare.
	 */
	private void traduci3par(String mess){
		int i,j=0,k=0,h=0,giatrovata=0;
				
		for(i=1;i<mess.length();i++)
		{
			if(mess.substring(i, i+1).equals(","))	//estraggo nomespecie e tipo dal comando del client
				if(giatrovata==0)
					{k=i;giatrovata=1;}
				else
					if(giatrovata==1)
						{j=i;giatrovata=2;}
				else
					h=i;
		}				
		str1=mess.substring(k+1, j);		
		str2=mess.substring(j+1, h);					//ricavo i dati dal messaggio
		str3=mess.substring(h+1, mess.length());			
	}
	
	
	/**
	 * Estrae quattro parametri dal messaggio ricevuto.
	 *  
	 * @param mess Messaggio ricevuto dal client contentente i parametri da isolare. 
	 */
	private void traduci4par(String mess){
		int i,j=0,k=0,h=0,m=0,virgola1=0,virgola2=0,virgola3=0;
		
				
		for(i=1;i<mess.length();i++)
			if(mess.substring(i, i+1).equals(","))	//estraggo token, idDino, x e y dal comando del client
				if(virgola1==0)
					{k=i;virgola1=1;}
				else
					if(virgola2==0)
					{j=i;virgola2=1;}
					else
						if(virgola3==0)
							{h=i;virgola3=1;}
						else
							m=i;
					
				
		str1=mess.substring(k+1, j);		
		str2=mess.substring(j+1,h);
		str3=mess.substring(h+1,m);
		str4=mess.substring(m+1,mess.length());
	}
	

	/**
	 * Metodoper interpretare il comando del client all'interno del
	 * messaggio che viene ricevuto.
	 * 
	 * @param mess Stringa da Client contenente richiesta.
	 * @return Il comando richiesto dall'utente.
	 */
	public String interpretaComando(String mess){			
		//interpreta comando								
		int i,k=0;
		String comando;
		for(i=mess.length()-1;i>1;i--)					
		{
			
			if(mess.substring(i, i+1).equals(","))
					{k=i;}
		}
		
		comando=mess.substring(1, k);
		
		
		return comando;
	}
	
}
